#ifndef XLCOMM_BASE_FILE_H_
#define XLCOMM_BASE_FILE_H_

#include <stdio.h>

#include <string>
#include <vector>

#include "xlcomm/define.h"
#include "xlcomm/noncopyable.h"

namespace xlcomm {

// 文件操作类（非线程安全）
class XLCOMM_API File : noncopyable {
 public:
  File();
  File(const char* file_path, const char* mode);
  ~File();

  // 打开文件
  bool Open(const char* file_path, const char* mode);

  // 关闭文件
  bool Close();

  // 文件是否已打开
  bool IsOpened() const { return file_ != nullptr; }

  // 获取文件路径
  std::string file_path() const { return file_path_; }

  // 移动读写指针到指定位置。whence取值：SEEK_SET、SEEK_CUR、SEEK_END
  bool Seek(off_t offset, int whence);

  // 获取当前读写指针位置。成功返回当前位置，失败返回-1
  int64_t Tell();

  // 获取文件整体长度。成功返回文件大小，失败返回-1
  int64_t Length();

  // 从文件读数据
  bool Read(void* out_buff, size_t size);

  // 写数据到文件
  bool Write(const void* buff, size_t size, bool flush = false);

  // 加载文件所有数据
  bool Load(std::string& out_data);

  // 清空缓冲区
  bool Flush();

 private:
  FILE* file_;
  std::string file_path_;
};

}  // namespace xlcomm

#endif  // XLCOMM_BASE_FILE_H_